/**
 * 
 */
package estrategias;

import juegos.*;
import java.util.Date;

/**
 * @author DaNieLooP
 * 
 * clase que implementa el algoritma A*
 *
 */
public class AEstrella implements Estrategia {
	
	/**
	 * Resolvemos un problema dado con el algoritmo A*
	 * 
	 * @param nInicial nodo inicial que se le pasa a la estrategia
	 * @return Nodo es el nodo objetivo, null si no acaba (de momento)
	 */
	public Nodo resuelve(Nodo nInicial,Nodo nFinal) {
		int generados = 1;
		int expandidos = 0;
		boolean enc = false;
		Date inicio = new Date();
		Nodo n = null;
		ColaPrioridadHeurANodos cola = new ColaPrioridadHeurANodos();
		ListaNodos listaCerrados = new ListaNodos();
		cola.inserta(nInicial);
		while(!enc){
			n = cola.extrae();
			if(n.esFinal()){
				Date fin = new Date();
				float total = (fin.getTime()-inicio.getTime())/1000f;
				enc = true;
				String saux = n.getCamino()+'\n'+"Nodos generados: "+generados+'\n'+"Nodos expandidos: "+expandidos+
				'\n'+"Tiempo transcurrido: "+total+" segundos"+'\n'+"Profundidad: "+n.getProfundidad()+'\n'+"Coste: "+n.getCoste();
				n.setCamino(saux);
			}else if(!listaCerrados.estadoRepetido(n)){
				listaCerrados.inserta(n);
				expandidos++;
				cola.insertaVector(n.generaHijos());
				generados = generados + n.generaHijos().size();
			}
		}
		return n;
	}
	/**
	 * 
	 * main para probar el algoritmo A*
	 */
	public static void main(String[] args) {
		NodoHanoi n = new NodoHanoi();
		AEstrella p = new AEstrella();
		NodoHanoi re = (NodoHanoi) p.resuelve(n,n);
		System.out.println(re.getCamino());
	}

}
